package com.study.optional;

import lombok.extern.slf4j.Slf4j;

import java.util.Optional;

@Slf4j
public class Test {

    
    public static void main(String[] args) {
        //(1)尝试访问 emptyOpt 变量的值会导致 NoSuchElementException。

//        Optional<User> emptyOpt = Optional.empty();
//        emptyOpt.get();


        //(2)你可以使用  of() 和 ofNullable() 方法创建包含值的 Optional。
        // 两个方法的不同之处在于如果你把 null 值作为参数传递进去，of() 
        // 方法会抛出 NullPointerException：

//        User user = null;
//        Optional<User> opt = Optional.of(user);
//        Optional<User> opt = Optional.ofNullable(user);

        //(3)从 Optional 实例中取回实际值对象的方法之一是使用 get() 方法：

//        String name = "John";
//        Optional<String> opt = Optional.ofNullable(name);
//        System.out.println(opt.get());

        //(4) isPresent检查是否有值 ifPresent如果有值 执行相应的处理

//        User user = new User("john@gmail.com", "1234");
//        Optional<User> opt = Optional.ofNullable(user);
//        System.out.println(opt.isPresent());
//        opt.ifPresent(u -> {
//            System.out.println(u.getEmail());
//        });

        //(5)如果有值则返回该值，否则返回传递给它的参数值

//        User user = new User("1@1.com", "1234");
//        User user2 = new User("anna@gmail.com", "1234");
//        User result = Optional.ofNullable(user).orElse(user2);
//        System.out.println(result.getEmail());

        //(6) 当user为空 orElse() 方法创建了 User 对象。与之相反，orElseGet() 方法不创建 User 对象

//        User user = null;
//        log.debug("Using orElse");
//        User result1 = Optional.ofNullable(user).orElse(new User("1@1.com", "1234"));
//        log.debug("Using orElseGet");
//        User result2 = Optional.ofNullable(user).orElseGet(() -> new User("1@1.com", "1234"));

        //为空抛出异常

//        User user = null;
//        User result = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());

        //map 转换值

//        User user = new User("anna@gmail.com", "1234");
//        String email = Optional.ofNullable(user).map(u -> u.getEmail()).orElse("default@gmail.com");
//        System.out.println(email);

        //flatMap 传入Optional

//        User user = new User("anna@gmail.com", "1234");
//        String email = Optional.ofNullable(user).flatMap(u -> Optional.ofNullable(u.getEmail())).orElse("default");
//        System.out.println(email);

        //filter 过滤
        User user = new User("anna@gmail.com", "1234");
        Optional<User> result = Optional.ofNullable(user).filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
        result.ifPresent(u -> System.out.println(u.getEmail()));
    }
}
